/**
 * call(thisArg)调用一个对象的一个方法，以另一个对象替换当前对象。
 * 如果没有thisArg参数，那么Global(全局)对象被用作thisArg
 * call()/apply()区别:这两个方法基本上是一个意思，区别在于 call 的第二个参数可以是任意类型，而apply的第二个参数必须是数组，也可以是arguments
 * 当调用一个函数时，可以赋值一个不同的 this 对象。this 引用当前对象，即 call 方法的第一个参数。
 * call/apply的作用主要就是改变作用域
 */

//实例一
function Animal() {
    this.name = 'Animal';
    this.showName = function (age) {
        console.log(this.name + '===' + age);
    }
}
function Cat() {
    this.name = 'Cat';

}
var animal = new Animal();
var cat = new Cat();

//通过call或apply方法，将原本属于Animal对象的showName()方法交给对象cat来使用了。
//call 的意思是把 animal 的方法放到cat上执行，原来cat是没有showName() 方法，现在是把animal 的showName()方法放到 cat上来执行，所以this.name 应该是 Cat
animal.showName.call(cat, 23)
animal.showName.apply(cat, [21])

//实例二
function add(a, b) {
    return (a + b);
}
function sub(a, b) {
    return (a - b);
}
console.log(add.call(sub, 3, 1));//这个例子中的意思就是用 add 来替换 sub，add.call(sub,3,1) == add(3,1) ，所以运行结果为：alert(4);

//实例三
var person = {
    name  : '骆柏燃',
    age   : 23,
    gender: '男',
    eat   : function () {
        console.log(this.name + '喜欢吃葡萄');
    }
}

var obj = {name: '小秋'};

person.eat.call(obj)//借用自定义方法




